package model;

import java.util.ArrayList;
import java.util.Collections;

import android.content.Context;

import memory.spel.R;

public class Spel {
	private int aantalTegels;
	private ArrayList<Tegel> tegels;
	private SpelSessie huidigeSpelSessie;
	
	/**
	 * Maak een nieuwe spel aan met de opgegeven aantal tegels
	 * @param aantalTegels
	 */
	public Spel(int aantalTegels) {
		this.aantalTegels = aantalTegels;
		createSpelBord();
		startNewSpelSessie(null);
	}
	
	/**
	 * Het aanmaken van het spelbord
	 */
	private void createSpelBord() {
		int[] afbeeldingen = new int[aantalTegels / 2];
		//Cropper cropper = new Cropper();
		//afbeeldingen = cropper.getAfbeeldingen();
		
	    //TODO: deze verwijderen als afbeeldingen via cropper gevuld wordt
		if (aantalTegels == 4) {
			afbeeldingen[0]=R.drawable.sample0;
		    afbeeldingen[1]=R.drawable.sample1;
		}
		
		if (aantalTegels == 8) {
			afbeeldingen[0]=R.drawable.sample0;
		    afbeeldingen[1]=R.drawable.sample1;
		    afbeeldingen[2]=R.drawable.sample2;
		    afbeeldingen[3]=R.drawable.sample3;	
		}
	    
	    createTegels(afbeeldingen);
	}
	/**
	 * Het aanmaken van de tegels met de afbeeldingen als tegel
	 * @param afbeeldingen
	 */
	private void createTegels(int[] afbeeldingen) {
		tegels = new ArrayList<Tegel>();
		 //aanmaken tegels, x2 want aantalTegels is totaal aantal
	    for (int i=0; i<afbeeldingen.length; i++) {
	    	Tegel tegel = new Tegel(afbeeldingen[i], i);
	    	Tegel tegel2 = new Tegel(afbeeldingen[i], i);
	    	tegels.add(tegel);
	    	tegels.add(tegel2);
	    }
	    //shuffle voor random volgorde tegels
	    Collections.shuffle(tegels);
	}
	/**
	 * Nieuw spel sessie starten
	 */
	public void startNewSpelSessie(Context context) {
		createSpelBord();
		huidigeSpelSessie = new SpelSessie();
	}
	/**
	 * Check of spel is afgelopen
	 */
	public void checkEindeSpel() {
		int aantalGevondenTegels = 0;
		for (Tegel tegel : tegels) {
			if (tegel.isGevonden()) {
				aantalGevondenTegels++;
			}
		}
		if (aantalGevondenTegels == aantalTegels) {
			huidigeSpelSessie.setGewonnen(true);
			huidigeSpelSessie.setEindeSpel(true);
		}
	}
	/**
	 * Zet de gevonden tegels op true
	 * @param tegel
	 * @param index
	 */
	public void setGevondenTegels(Tegel tegel, int index) {
		//geklikte tegel gevonden true zetten
		setGevondenTegel(tegel, index);
		//vorige tegel gevonden true zetten
		int positionVorigeTegel = getHuidigeSpelSessie().getVorigeTegelPos();
		Tegel vorigeTegel = getHuidigeSpelSessie().getVorigeTegel();
		setGevondenTegel(vorigeTegel, positionVorigeTegel);
	}
	
	//********************************************************
	//Getters en setters
	//
	//********************************************************
	/**
	 * Get tegels
	 */
	public ArrayList<Tegel> getTegels() {
		return tegels;
	}
	/**
	 * Get bepaalde tegel
	 * @param index
	 * @return
	 */
	public Tegel getTegel(int index) {
		return tegels.get(index);
	}
	/**
	 * Zet de gevonden waarde op true bij een tegel
	 * @param tegel
	 * @param index
	 */
	private void setGevondenTegel(Tegel tegel, int index) {
		tegel.setGevonden(true);
		setTegel(tegel, index);
	}
	/**
	 * Get huidige spel sessie
	 * @return
	 */
	public SpelSessie getHuidigeSpelSessie() {
		return huidigeSpelSessie;
	}
	/**
	 * Zet het aantal tegels van het spel
	 * @param aantalTegels
	 */
	public void setAantalTegels(int aantalTegels) {
		this.aantalTegels = aantalTegels;
	}
	/**
	 * Set tegel op de index
	 * @param tegel
	 * @param index
	 */
	public void setTegel(Tegel tegel, int index) {
		tegels.set(index, tegel);
	}
	/**
	 * Get aantal tegels
	 * @return
	 */
	public int getAantalTegels() {
		return aantalTegels;
	}
}
